#include "Queue.h"

void InitQueue(Queue *q)
{
    q->front = q->op = 0;
    q->rear = MaxSize - 1;
}
void DestroyQueue(Queue *q)
{
    q->front = q->op = 0;
    q->rear = MaxSize - 1;
}
bool Push(Queue *q, Type val)
{
    if (Fill(q))
        return false;
    q->rear = (q->rear + 1) % MaxSize;
    q->array[q->rear] = val;
    q->op = 1;
    return true;
}
bool Pop(Queue *q, Type *val)
{
    if (Empty(q))
        return false;
    *val = q->array[q->front];
    q->front = (q->front + 1) % MaxSize;

    q->op = 0;
    return true;
}
bool Empty(Queue *q)
{
    return (q->rear + 1) % MaxSize == q->front && q->op == 0;
}
bool Fill(Queue *q)
{
    return (q->rear + 1) % MaxSize == q->front && q->op == 1;
}
bool GetHead(Queue *q, Type *val)
{
    if (Empty(q))
        return false;
    *val = q->array[q->front];
    return true;
}

int Length(Queue *q)
{
    if (Empty(q))
        return 0;
    else if (Fill(q))
        return MaxSize;
    else
        return (q->rear + MaxSize - q->front + 1) % MaxSize;
}
// #include "Queue.h"

// void InitQueue(Queue *q)
// {
//     q->front = q->rear = q->op = 0;
// }
// void DestroyQueue(Queue *q)
// {
//     q->front = q->rear = q->op = 0;
// }
// bool Push(Queue *q, DataType val)
// {
//     if (Fill(q))
//         return false;
//     q->array[q->rear] = val;
//     q->rear = (q->rear + 1) % MaxSize;
//     q->op = 1;
//     return true;
// }
// bool Pop(Queue *q, DataType *val)
// {
//     if (Empty(q))
//         return false;
//     *val = q->array[q->front];
//     q->front = (q->front + 1) % MaxSize;
//     q->op = 0;
//     return true;
// }
// bool Empty(Queue *q)
// {
//     return q->rear == q->front && q->op == 0;
// }
// bool Fill(Queue *q)
// {
//     return q->rear == q->front && q->op == 1;
// }
// bool GetHead(Queue *q, DataType *val)
// {
//     if (Empty(q))
//         return false;
//     *val = q->array[q->front];
//     return true;
// }

// int Length(Queue *q)
// {
//     if (Empty(q))
//         return 0;
//     else if (Fill(q))
//         return MaxSize;
//     else
//         return (q->rear + MaxSize - q->front) % MaxSize;
// }

// #include "Queue.h"

// void InitQueue(Queue *q)
// {
//     q->front = q->rear = q->size = 0;
// }
// void DestroyQueue(Queue *q)
// {
//     q->front = q->rear = q->size = 0;
// }
// bool Push(Queue *q, DataType val)
// {
//     if (Fill(q))
//         return false;
//     q->array[q->rear] = val;
//     q->rear = (q->rear + 1) % MaxSize;
//     q->size++;
//     return true;
// }
// bool Pop(Queue *q, DataType *val)
// {
//     if (Empty(q))
//         return false;
//     *val = q->array[q->front];
//     q->front = (q->front + 1) % MaxSize;
//     q->size--;
//     return true;
// }
// bool Empty(Queue *q)
// {
//     return q->size == 0;
// }
// bool Fill(Queue *q)
// {
//     return q->size == MaxSize;
// }
// bool GetHead(Queue *q, DataType *val)
// {
//     if (Empty(q))
//         return false;
//     *val = q->array[q->front];
//     return true;
// }

// int Length(Queue *q)
// {
//     return q->size;
// }

// #include "Queue.h"

// void InitQueue(Queue *q)
// {
//     q->front = q->rear = 0;
// }
// void DestroyQueue(Queue *q)
// {
//     q->front = q->rear = 0;
// }
// bool Push(Queue *q, DataType val)
// {
//     if (Fill(q))
//         return false;
//     q->array[q->rear] = val;
//     q->rear = (q->rear + 1) % MaxSize;
//     return true;
// }
// bool Pop(Queue *q, DataType *val)
// {
//     if (Empty(q))
//         return false;
//     *val = q->array[q->front];
//     q->front = (q->front + 1) % MaxSize;
//     return true;
// }
// bool Empty(Queue *q)
// {
//     return q->rear == q->front;
// }
// bool Fill(Queue *q)
// {
//     return (q->rear + 1) % MaxSize == q->front;
// }
// bool GetHead(Queue *q, DataType *val)
// {
//     if (Empty(q))
//         return false;
//     *val = q->array[q->front];
//     return true;
// }

// int Length(Queue *q)
// {
//     return (q->rear + MaxSize - q->front) % MaxSize;
// }